// 导出一个axios的实例  而且这个实例要有请求拦截器 响应拦截器


import axios from 'axios'
import store from '@/store'
import { getTokenTimeStamp } from './auth'
import router from '@/router'
// 设置过期时间
const ExpirationTime=60*60     //3600秒   1小时

// 定义一个时间戳函数
function isCheckTimeOut(){
  // 这个方法是检查token有没有过期
  // 获取现在的时间
  const curtime=Date.now()
  // (现在的时间-存储token的时间)/1000>ExpirationTime
  // 返回的结果是true  说明token已经过期了  否则没有过期
  return (curtime-getTokenTimeStamp())/1000>ExpirationTime //这里如果大于了 就说明已经过期了  就是true
}

    
// 创建一个axios的实例
const service = axios.create({
    // 设置基础路径
    // baseURL:'http://ihrm.itheima.net',  //1 因为涉及到跨域  需要使用代理服务器  所以需要在config.js中配置 代理服务器 并设置基地址 这里只需要补全接口即可
    // baseURL:'/api', // 2因为 有涉及到后期会出现 开发模式和生产模式切换导致 接口变化  所以这里又需要引入 process.env.VUE_APP_BASE_API  因为开发模式和生产模式的属性名都是VUE_APP_BASE_API
    baseURL:process.env.VUE_APP_BASE_API, //3 因为开发模式和生产模式的属性名都是VUE_APP_BASE_API  这里这样就可以根据他们的属性值的变化而切换
    timeout:5000 //发送axios时间超过5秒 就取消发送
}) 

// 请求拦截器
// service.interceptors.request.use() // 请求拦截器
// 添加请求拦截器
service.interceptors.request.use(function (config) {
  console.log('所有正常请求在到达服务器之前都经过这里',config);
//   判断是否登录  如果已经登录 直接获取token
console.log("store",store);  //得到了 store.state.user.token
const token=store.state.user.token
if(token){
// 首先要确定有token 然后在检查token有没有过期
 if(isCheckTimeOut()){
  // isCheckTimeOut()返回的结果是true token失效
  // 清空token 清空用户信息s
  store.commit('user/delToken')
  store.commit('user/delUserInfo')
  // 跳转到登录页
  router.push('/login')
  // 因为token失效了 所以要手动抛出一个错误提示
  return Promise.reject(new Error('token过期了,请重新登录'))
 }

// 在请求headers中统一携带token    因为接口需要token前面带有Bearer  所有使用字符串拼接
    config.headers.Authorization=`Bearer ${token}`  //
}
// config是请求对象,此对象转发给服务器
    return config;
 
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

  //响应拦截器
// service.interceptors.response.use() // 响应拦截器
service.interceptors.response.use(function (response) {
    console.log('所有正常响应在经过浏览器之前都会经过这里',response);  //response.data.success=true
    // 判断业务是否错误  (取反)
    if(!response.data.success) {
        // 如果状态业务错误,手动返回一个错误
        return  Promise.reject(new Error(response.data.message));
    }
    return response.data   //这里本应该是return response   多写一个.data是解包裹  后面方便使用
  }, function (error) {
  console.log('所有的错误响应在返回浏览器之前都经过这里',error.response);
  // 判断是否是401 如果是  就说明token失效了  退出登录  跳转到登录页
  if(error.response.status===401&&error.response.data.code===10002){
    // 清空用户信息  清空token
    store.commit('user/delToken')
    store.commit('user/delUserInfo')
    // 跳转到登录页
    // router.push('/login')
    // 这里也需要考虑到退出前的页面
   router.push(`/login?url=${encodeURIComponent( this.$route.fullPath)}`)
  }

    return Promise.reject(error);
  });

export default service // 导出axios实例